设计模式之禅
[TOC]
第一部分 六大原则
一.单一职责原则(SRP:Single Responsibility Principle)
- 定义:应该有且仅有一个原因引起类的变更
建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化,也适用于方法 - 优点:
- 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多
- 提高类的可读性,提高系统的可维护性
- 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响
二.里氏替换原则(LSP:Liskov Substitution Principle)
- 定义:所有引用基类的地方必须能透明地使用其他子类对象
- 含义:
- 子类必须完全实现父类的方法
如果子类不能完整的实现父类的方法,建议断开父子继承关系,采用依赖、
聚合、组合等关系来替代 - 子类可以有自己的个性
- 覆盖或实现方法时输入参数(前置条件)可以被放大
- 覆写或实现父类方法时输出结果(后置条件)可以被缩小
- 子类必须完全实现父类的方法
依赖:强调的是使用上的关系,是单向的
关联(聚合、组合):
- 聚合(has-a):整体和部分都可以有各自的声明周期
- 组合(contains-a):整体和部分不可分割
UML图指向整体,聚合为空心菱形,组合为实心
UML类图的画法见另一份笔记
继承是is-a。接口是like-a。参考博文: https://blog.csdn.net/jy55149676/article/details/80537779
三.依赖倒置原则(DIP:Dependence Inversion Principle)
含义:
- 高层模块不应该依赖低层模块,两者应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
不可分割的原子逻辑就是低层模块,原子逻辑再组装就是高层模块
java语言中,抽象:接口或抽象类,细节:可以直接被实例化
实践:
- 每个类尽量都有接口或抽象类
- 变量的表面类型尽量是接口或抽象类
- 任何类都不应该从具体类派生
四.接口隔离原则(Interface Segregation Principle)
- 定义:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上
接口要尽量小,但也是有限度的 - 优点:通过分散定义多个接口,可以预防未来变更的扩散,提高系统的灵活性和可维护性
单一职责与接口隔离对比:两者审视的角度不同
单一职责注重业务逻辑的划分;接口隔离注重接口的方法应该尽量少,只暴露别人需要的部分
根据接口隔离原则划分接口的时候,首先必须满足单一职责原则
五.迪米特法则
- 定义:一个对象应该对其他对象有最少了解(只与朋友类交流、两部分之间的交流做适当的控制)
- 优点:弱耦合(弱耦合可以使得类的复用率提高,但是会产生大量的中转类,导致系统复杂性的提高)
六.开闭原则
- 定义:一个软件实体应该对扩展开放,对修改关闭
(前面五个原则是对开闭原则的具体解释) - 优点:在对扩展开放的同时,尽量减少对原有代码的修改,保持历史代码的纯洁性,提高系统的稳定性